package secondary

/*
	输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字。

	示例 1：

	输入：matrix = [
		[1,2,3],
		[4,5,6],
		[7,8,9]]
	输出：[1,2,3,6,9,8,7,4,5]
	示例 2：

	输入：matrix =[[1,2,3,4],[5,6,7,8],[9,10,11,12]]
	输出：[1,2,3,4,8,12,11,10,9,5,6,7]

	限制：

	0 <= matrix.length <= 100
	0 <= matrix[i].length<= 100

	来源：力扣（LeetCode）
	链接：https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof
	著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/
// 按层模拟、设上下左右四条边、由外层向内层填充
func SpiralOrder(matrix [][]int) []int {
	return spiralOrder(matrix)
}

func spiralOrder(matrix [][]int) []int {
	if len(matrix) == 0 {
		return nil
	}
	res := make([]int, 0)
	top, bottom, left, right := 0, len(matrix)-1, 0, len(matrix[0])-1
	for left <= right && top <= bottom {
		for idx_top := left; idx_top <= right; idx_top++ {
			res = append(res, matrix[top][idx_top])
		}
		for idx_r := top + 1; idx_r <= bottom; idx_r++ {
			res = append(res, matrix[idx_r][right])
		}
		if left < right && top < bottom { // 考虑只有一行和只有一列的情况
			for idx_btm := right - 1; idx_btm > left; idx_btm-- {
				res = append(res, matrix[bottom][idx_btm])
			}
			for idx_left := bottom; idx_left > top; idx_left-- {
				res = append(res, matrix[idx_left][left])
			}
		}

		top++
		bottom--
		left++
		right--
	}
	return res
}
